package com.redepronik.negosys.invfac.service;

import java.math.BigDecimal;
import java.util.List;

import org.primefaces.model.StreamedContent;
import org.springframework.transaction.annotation.Transactional;

import com.redepronik.negosys.invfac.entity.Bodega;
import com.redepronik.negosys.invfac.entity.Producto;
import com.redepronik.negosys.invfac.entity.Productounidad;
import com.redepronik.negosys.invfac.entity.TipoPrecioProducto;
import com.redepronik.negosys.invfac.entityAux.BodegaProducto;
import com.redepronik.negosys.invfac.entityAux.ControlInventarioReporte;
import com.redepronik.negosys.invfac.entityAux.TablaPrecios;

public interface ProductoService {

	@Transactional
	public void actualizar(Producto producto,
			List<TablaPrecios> listaPrecioProductos);

	public StreamedContent generarCodigo(Producto producto, String codigoTipo);

	@Transactional
	public void actualizarKardexInicial(Producto producto, Bodega bodega,
			Integer cantidad);

	public void calcularPrecioPorGanancia(Producto producto,
			TablaPrecios tablaPrecios);

	public void calcularPrecioPorPorcentaje(Producto producto,
			TablaPrecios tablaPrecios);

	public void calcularPrecioPorIva(Producto producto,
			TablaPrecios tablaPrecios);

	public BigDecimal calcularPrecio(Producto producto, int bodegaId,
			int precioId);

	public BigDecimal calcularPrecio(Producto producto, int precioId);

	public List<TablaPrecios> calcularPrecios(Producto producto,
			List<TablaPrecios> listaPrecios);

	public boolean comprobarCaracteristicasVacias(Producto producto);

	@Transactional
	public Boolean comprobarDatos(String campo, String valor, String id);

	public boolean comprobarPreciosVacias(
			List<TablaPrecios> listaPrecioProductos);

	public boolean comprobarUnidadesVacias(Producto producto);

	public Long contar();

	public String convertirUnidadString(int cantidad, List<Productounidad> list);

	@Transactional
	public void eliminar(Producto producto);

	public void eliminarTipoPrecioProducto(TablaPrecios tablaPrecios,
			List<TablaPrecios> listaPrecioProductos);

	@Transactional(readOnly = true)
	public void eliminarUnidad(Producto producto, Productounidad productoUnidad);

	@Transactional
	public void insertar(Producto producto,
			List<TablaPrecios> listaPrecioProductos);

	public Producto nombre(Producto producto);

	@Transactional(readOnly = true)
	public List<Producto> obtener();

	@Transactional(readOnly = true)
	public List<Producto> obtener(String criterioBusqueda, Integer grupoId);

	@Transactional(readOnly = true)
	public List<ControlInventarioReporte> obtenerControlInventario(
			Integer bodegaId);

	@Transactional(readOnly = true)
	public List<Producto> obtenerParaBusqueda(String nombreProducto);

	@Transactional(readOnly = true)
	public List<Producto> obtenerPorBodega(Integer bodegaId);

	@Transactional(readOnly = true)
	public List<Producto> obtenerPorBodegaAndGrupo(Integer bodegaId,
			Integer grupoId);

	@Transactional(readOnly = true)
	public List<BodegaProducto> obtenerPorBodegaProducto(String ean);

	@Transactional(readOnly = true)
	public Producto obtenerPorCodigo(String codigo);

	@Transactional(readOnly = true)
	public Producto obtenerPorCodigosAndLocal(Integer localId, String codigo);

	@Transactional(readOnly = true)
	public Producto obtenerPorEan(String ean);

	@Transactional(readOnly = true)
	public List<Producto> obtenerPorEanAndBodega(String ean, Integer bodegaId);

	@Transactional(readOnly = true)
	public List<Producto> obtenerPorKardexInicial(Integer bodegaId);

	@Transactional(readOnly = true)
	public List<Producto> obtenerPorLocal(String criterioProductoBusqueda,
			Integer localId);

	@Transactional(readOnly = true)
	public Producto obtenerPorProductoId(Long productoId);

	public Integer obtenerPvpPorProducto(List<TipoPrecioProducto> list);

	public TipoPrecioProducto obtenerValorPvp(List<TipoPrecioProducto> list);
}